package com.wyl.zipByStream;

import cn.hutool.core.io.FileUtil;

import java.awt.*;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 * @author 吴宇亮 on 2023/4/14 11:04
 */
public class Main {

    public static void main(String[] args) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
        // 假设要生成一个zip包，目录结构如下
        // - hello.txt
        // - 文件夹1
        //      - test.txt
        // - 文件夹2

        zipOutputStream.putNextEntry(new ZipEntry("/hello.txt"));
        zipOutputStream.write("我是一个demo".getBytes(StandardCharsets.UTF_8));
        zipOutputStream.closeEntry();

        zipOutputStream.putNextEntry(new ZipEntry("/文件夹1/test.txt"));
        zipOutputStream.write("我是一个demo".getBytes(StandardCharsets.UTF_8));
        zipOutputStream.closeEntry();

        zipOutputStream.putNextEntry(new ZipEntry("/文件夹2/"));
        zipOutputStream.closeEntry();

        zipOutputStream.close();
        byteArrayOutputStream.close();

        // 获取bytes
        // 注意！！！必须要先关闭流在获取字节，否则会导致用winRAR打开会提示文件末端异常
        byte[] bytes = byteArrayOutputStream.toByteArray();

        String tmpdirPath = System.getProperty("java.io.tmpdir") + File.separator + "zipTest";
        // 将文件写到临时目录中
        FileUtil.writeBytes(bytes, tmpdirPath + File.separator + "zipDemo.zip");
        // 如果当前平台支持桌面操作，使用桌面打开目录，否则使用运行时命令打开目录。
        if (Desktop.isDesktopSupported()) {
            Desktop.getDesktop().open(new File(tmpdirPath));
        } else {
            Runtime.getRuntime().exec("explorer.exe /select," + tmpdirPath);
        }
    }
}
